<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script type="text/javascript">
        function Car() {

        }
        Car.prototype.name = '马自达'; // 实例化之前原型添加一个属性 添加的是实例化的car的__proto__的name
        // __proto__是在实例化的时候产生的 指向实例化对象
        // prototype 指向的构造器constructor
        let car = new Car(); // 在new的时候会隐藏产生this对象 this = { __proto__:Car.prototype }
        // Car.prototype 指向的是Car的构造器constructor并不是实例化的car 修改他与car无关
        Car.prototype = {
            name: '奔驰'
        }
        console.log(car); // 马自达

        /**
         * function Car(){
         *  var this = {
         *      __proto__:Car.prototype={
         *              name:'奔驰'
         *          }
         *  }
         * }
         */
        // 自己增加__proto__属性是无效的
        // null 和 undefined 不能使用toString方法 因为原始值是没有属性和方法的 他们没有包装类
        // num和string是存在包装类的 new Number() 和 new String()通过内置的构造函数才能toString

        let num = 1;
        let obj1 = {};
        let obj2 = Object.create(null);
        // 都是调用toString方法后显示的
        document.write(num); // 1
        document.write(obj1); // [object Object]
        // document.write(obj2); // 报错 因为Object.create(null)没有原型 所以没有toString方法
        console.dir(obj1.__proto__);
    </script>
</body>

</html>